#include "tabuser.h"

TabUser::TabUser(Tabwidget* t, QPushButton* user, Legami* l, QSqlDatabase* db): Tab(t,l,db), user(user)
{
    init_tab();
}

void TabUser::horizontal_bar_choice()
{
    hgc = new QGroupBox();
    layout = new QGridLayout;

    new_user= new QPushButton("Nuovo Login Utente", this);

    bd->hide();
    sc->hide();
    sc2->hide();
    faceb->hide();
    twitt->hide();

    layout->addWidget(label1, 0,1, Qt::AlignRight | Qt::AlignBottom);
    layout->addWidget(le1, 0,2, Qt::AlignLeft | Qt::AlignBottom);
    layout->addWidget(label2, 1,1, Qt::AlignRight | Qt::AlignTop);
    layout->addWidget(le2, 1,2, Qt::AlignLeft | Qt::AlignTop);
    layout->addWidget(registro, 2,1, Qt::AlignRight | Qt::AlignBottom);
    layout->addWidget(accedi, 2,2,Qt::AlignLeft | Qt::AlignBottom);
    layout->addWidget(alert,3,2, Qt::AlignCenter);
    layout->addWidget(new_user,4,4, Qt::AlignRight);

    //dimensione colonne
    layout->setColumnStretch(0,10);
    layout->setColumnStretch(1, 30);
    layout->setColumnStretch(2, 30);
    layout->setColumnStretch(3, 10);
    layout->setColumnStretch(4,10);
    layout->setColumnStretch(5,10);

    //dimensione righe
    layout->setRowStretch(0,1);
    layout->setRowStretch(1,1);
    layout->setRowStretch(2, 5);
    layout->setRowStretch(3,20);
    layout->setRowStretch(4, 5);

    alert->hide();

    hgc->setLayout(layout);

    accedi->setEnabled(false);

    connect(new_user, SIGNAL(clicked()), this, SLOT(tabba()));
    disconnect(registro,0,0,0);
    connect(registro, SIGNAL(clicked()), this, SLOT(regist()));
    connect(le1, SIGNAL(textChanged(QString)), this, SLOT(userinsert(QString)));
    connect(le2, SIGNAL(textChanged(QString)), this, SLOT(pwdinsert(QString)));
}

void TabUser::stepinfo(){
    hideAll();
    clear_le();

    step->setText("Secondo passo: \nInformazioni aggiuntive");
    label1->setText("Compleanno");
    info->setText("Inserire ultime due scuole\nfrequentate");
    label2->setText("Scuola");
    label3->setText("Scuola");
    label4->setText("Link Facebook \n(Facoltativo)");
    le4->setEchoMode(QLineEdit::Normal);
    label5->setText("Link Twitter \n(Facoltativo)");
    registro->setText("Registrati");
    label6->setText("Interessi");

    step->show();
    info->show();
    label1->show();
    label2->show();
    label3->show();
    label4->show();
    label5->show();
    label6->show();
    le1->show();
    le2->show();
    le3->show();
    le4->show();
    le5->show();
    le6->show();
    le7->show();
    le8->show();
    le9->show();
    le10->show();
    gg->show();
    mm->show();
    aa->show();
    in->show();
    registro->show();

    int index= tabbed->indexOf(this);
    tabbed->setTabText(index, "Registrazione utente: Passo II");

    //nuovo layout
    layout->addWidget(step, 0,3, Qt::AlignRight| Qt::AlignTop);
    layout->addWidget(label1, 1,2, Qt::AlignRight| Qt::AlignTop);
    layout->addWidget(gg, 1,3, Qt::AlignLeft| Qt::AlignTop);
    layout->addWidget(mm, 1,3, Qt::AlignCenter| Qt::AlignTop);
    layout->addWidget(aa, 1,4, Qt::AlignLeft| Qt::AlignTop);
    layout->addWidget(label2, 3,2, Qt::AlignRight| Qt::AlignTop);
    layout->addWidget(le2, 3,3, Qt::AlignLeft| Qt::AlignTop);
    layout->addWidget(info, 3,4, Qt::AlignLeft| Qt::AlignTop);
    layout->addWidget(label3, 4,2, Qt::AlignRight| Qt::AlignTop);
    layout->addWidget(le3, 4,3,Qt::AlignLeft| Qt::AlignTop);
    layout->addWidget(label4,5,2, Qt::AlignRight| Qt::AlignTop);
    layout->addWidget(le4,5,3, Qt::AlignLeft| Qt::AlignTop);
    layout->addWidget(label5,6,2, Qt::AlignRight| Qt::AlignTop);
    layout->addWidget(le1, 6,3, Qt::AlignLeft| Qt::AlignTop);
    layout->addWidget(label6, 7,2, Qt::AlignRight| Qt::AlignTop);
    layout->addWidget(in, 7,3, Qt::AlignLeft| Qt::AlignTop);
    layout->addWidget(le5,8,3,Qt::AlignLeft| Qt::AlignTop);
    layout->addWidget(le6,8,4,Qt::AlignLeft| Qt::AlignTop);
    layout->addWidget(le7,9,3,Qt::AlignLeft| Qt::AlignTop);
    layout->addWidget(le8,9,4,Qt::AlignLeft| Qt::AlignTop);
    layout->addWidget(le9,10,3,Qt::AlignLeft| Qt::AlignTop);
    layout->addWidget(le10,10,4,Qt::AlignLeft| Qt::AlignTop);
    layout->addWidget(alert,11,3, Qt::AlignRight | Qt::AlignTop);
    layout->addWidget(registro,12,3, Qt::AlignCenter| Qt::AlignTop);

    le6->hide();
    le7->hide();
    le8->hide();
    le9->hide();
    le10->hide();

    disconnect(in,0,0,0);
    connect(in, SIGNAL(valueChanged(int)), this, SLOT(ridim(int)));

    //dimensione colonne
    layout->setColumnStretch(0,5);
    layout->setColumnStretch(1,10);
    layout->setColumnStretch(2,20);
    layout->setColumnStretch(3,20);
    layout->setColumnStretch(4,20);
    layout->setColumnStretch(5,10);
    layout->setColumnStretch(6,20);

    disconnect(registro,0,0,0);
    connect(registro, SIGNAL(clicked()), this, SLOT(end()));
}

void TabUser::up_db(int x){
    QSqlQuery query(*db);
    query.prepare("Update utenti set aeb=:aeb where username= :user");
    query.bindValue(":aeb", x);
    query.bindValue(":user", current->getNick());
    query.exec();
}

void TabUser::check_other(){
    //controllo su "Scuole"
    if(le2->text().isEmpty()||le3->text().isEmpty()){
        alert->setText("Alcuni campi vuoti. Riempire");
        alert->show();
    }
    //controllo su eventuali link facebook || twitter
    else if(!(le4->text().isEmpty()) && !(check_url(le4->text(),0))){   //controllo facebook,stato 0
        alert->setText("Inserire url di Facebook valido");
        alert->show();
    }
    else if(!(le1->text().isEmpty()) && !(check_url(le1->text(),1))){       //controllo twitter, stato 1
        alert->setText("Inserire url di Twitter valido");
        alert->show();
    }
    //controllo su "Interessi"
    else if(!(check_interest())){
        alert->setText("Riempire tutti i campi Interessi selezionati.");
        alert->show();
    }
    else{   //tutto ok
        hideAll();
        QString bd= gg->currentText().append(" ").append(mm->currentText()).append(" ").append(aa->currentText());
        tempinfo= new Info(bd, temp_in, le2->text(), le3->text(), le4->text(), le1->text());
        tempprof= new Profilo(tempinfo);
        int aeb= cbacc->currentIndex();
        switch(aeb){
        case 0:
            tempaccount= new Account(tempusern, tempprof);
            break;
        case 1:
            tempaccount= new BusinessAccount(tempusern, tempprof);
            break;
        case 2:
            tempaccount= new ExecutiveAccount(tempusern, tempprof);
            break;
        }
        //inserisco in Legami
        gestore->add(tempaccount);
        //Inserisco in Database:
        //prima su Account
        QSqlQuery query(*db);
        db->transaction();
        query.prepare("Insert into utenti(username,nome,cognome,password,aeb,sesso)"
                      "values(:username,:nome,:cognome,:password,:aeb,:sesso)");
        query.bindValue(":username", tempaccount->getNick());
        query.bindValue(":nome", tempaccount->getNome());
        query.bindValue(":cognome", tempaccount->getCognome());
        query.bindValue(":password", tempaccount->getPwd());
        query.bindValue(":aeb", aeb);
        query.bindValue(":sesso", tempaccount->getGender());
        query.exec();
        db->commit();
        //Poi su Info
        QSqlQuery query_info(*db);
        db->transaction();
        for(QVector<QString>::iterator it= temp_in.begin(); it!= temp_in.end(); it++){
            query_info.prepare("Insert into info(username,new_school,old_school,birthday,link1,link2,interest)"
                          "values(:username,:ns,:os,:bd,:l1,:l2,:in)");
            query_info.bindValue(":username", tempaccount->getNick());
            query_info.bindValue(":ns", le3->text());
            query_info.bindValue(":os", le2->text());
            query_info.bindValue(":bd", bd);
            query_info.bindValue(":l1", le4->text());
            query_info.bindValue(":l2", le1->text());
            query_info.bindValue(":interest", *it);
            query_info.exec();
        }
        db->commit();
        //Cambio il testo della tab
        QString nc= "Sessione utente: ";
        nc.append(tempaccount->getNome()).append(" ").append(tempaccount->getCognome());
        int index= tabbed->indexOf(this);
        tabbed->setTabText(index, nc);
        QMessageBox::about(this, "Benvenuto in Legami.", "Registrazione effettuata con successo.\nPer poter continuare a navigare"
                           " in Legami, accedere.");
        logout();
    }
}

void TabUser::showprofile(User* prof_u){
    switch(tryAcc(prof_u)){
    case 0:
        missingacc();
        return;
    case 1:
        showprofile(current);
        return;
    case 2:
        Tab::showprofile(prof_u);
        if(prof_u==current){    //se profilo dell'account in uso
            accedi->setText("Disconnetti");
            accedi->setEnabled(true);
            canc->setEnabled(true);
            accedi->setIcon(QIcon(""));
            delacc->show();
            accedi->show();
            upgrade->setText("Upgrade");
            upgrade->setIcon(QIcon());
            upgrade->show();
            searchacc->show();
            searchgru->show();
            back->setEnabled(false);
            groups->show();
            contacts->show();
        }
        else{       //senno' e' un altro utente
            usercurr= prof_u;
            QString tag;
            if(current->found(prof_u,tag)){  //e' gia' nella lista dei contatti
                if(!(tag.isEmpty()))
                    label1->setText(label1->text().append(", ").append(tag));
                canc->show();
                canc->setEnabled(true);
            }
            else{
                registro->show();
                registro->setEnabled(true);
                registro->setEnabled(true);
            }
            back->setEnabled(true);
        }

        groups->setIcon(QIcon("icons/groups.png"));
        contacts->setIcon(QIcon("icons/friends.png"));
        registro->setText("Aggiungi contatto");
        registro->setIcon(QIcon("icons/add-friend.jpg"));
        canc->setText("Rimuovi contatto");
        canc->setIcon(QIcon("icons/remove_friend.png"));

        new_user->show();

        layout->addWidget(accedi,0,4);
        layout->addWidget(canc,1,4);     //canc per rimuovere contatto-----|non saranno mai assieme,posso metterle sulla stessa cella!
        layout->addWidget(registro, 1, 4); //registro per aggiungere contatto--|
        layout->addWidget(delacc, 1, 4);    //delacc e' per eliminare proprio profilo. Come sopra,non crea interferenza
        layout->addWidget(groups, 2,4);
        layout->addWidget(contacts, 3,4);
        layout->addWidget(upgrade, 4,4);
        layout->addWidget(searchacc, 5,4);
        layout->addWidget(searchgru, 6,4);

        current->gestQPBprinc(upgrade);

        int numrow= layout->rowCount();
        layout->addWidget(new_user, numrow,4, Qt::AlignRight);
        layout->addWidget(back, numrow,0,Qt::AlignLeft);

        disconnect(back,0,0,0);
        connect(back,SIGNAL(clicked()), this,SLOT(backslot()));
        connect(delacc, SIGNAL(clicked()), this, SLOT(confirm()));
        disconnect(registro,0,0,0);
        connect(registro, SIGNAL(clicked()), this, SLOT(chooseTag()));
        disconnect(canc,0,0,0);
        connect(canc,SIGNAL(clicked()),this,SLOT(remove()));
        disconnect(upgrade,0,0,0);
        connect(upgrade, SIGNAL(clicked()), this, SLOT(up()));
        disconnect(accedi,0,0,0);
        connect(accedi,SIGNAL(clicked()),this,SLOT(logout()));
        connect(groups, SIGNAL(clicked()), this, SLOT(showgroups()));
        connect(contacts, SIGNAL(clicked()), this, SLOT(showfriends()));
        disconnect(searchacc,0,0,0);
        connect(searchacc, SIGNAL(clicked()), this, SLOT(cercaUser_g()));
        disconnect(searchgru,0,0,0);
        connect(searchgru, SIGNAL(clicked()), this, SLOT(cercaGruppo_g()));
    }
}

void TabUser::showG(Gruppo* gr){
    switch(tryGru(gr)){
    case 0:
        missingacc();
        return;
    case 1:
        showgroups();
        return;
    case 2:
        Tab::showG(gr);

        QString cg= "Creatore del gruppo: ";
        if(gr->getProp()==current->getNick()){
            canc->setText("Elimina Gruppo");
            canc->setIcon(QIcon("icons/erasegruppo.png"));
            canc->show();
            current->gestEraseG(canc);
            cg.append("Tu");
        }
        else{
            cg.append(gr->getProp());
            if(current->iscritto(gr)){  //current gia' iscritto al gruppo
                accedi->setText("Esci dal gruppo");
                accedi->setIcon(QIcon("icons/erasegruppo.png"));
                accedi->show();
            }
            else{   //current non e' nel gruppo
                upgrade->setText("Iscriviti al gruppo");
                upgrade->setIcon(QIcon("icons/addgruppo.jpg"));
                upgrade->show();
                upgrade->setEnabled(true);
            }
        }
        label4->setText(cg);
        layout->addWidget(canc,1,4);
        layout->addWidget(accedi,1,4);
        layout->addWidget(upgrade,1,4);

        QVector<User*> mem= gr->getMembri();
        profac.clear();
        int row=3;
        for(QVector<User*>::iterator it= mem.begin(); it!= mem.end(); it++){
            if((*it)->getNick()!=current->getNick()){ //se e' l'utente loggato, non lo mostro
                QPushButton* pb= new QPushButton((*it)->getNome().append(" ").append((*it)->getCognome()));
                int s= (*it)->getGender();
                pbicon(pb,s);
                Account* acc= gestore->getAcc((*it));//mi ricavo l'account relativo di User in legami, per andar meglio a fare i
                                                     //controlli se un membro di gruppo e' stato cambiato o upgradato
                profac.insert(pb,acc);
                connect(pb, SIGNAL(pressed()), this, SLOT(showuser()));
                }
            }

        if(!sortPA(row))   //riordino profac
            label3->setText("Non ci sono altri utenti");

        int numrows= layout->rowCount();
        dim_row(row,numrows);   //ridimensiono righe

        back->show();
        new_user->show();
        layout->addWidget(back, numrows, 0, Qt::AlignLeft);
        layout->addWidget(new_user, numrows, 4, Qt::AlignRight);

        disconnect(canc,0,0,0);
        connect(canc, SIGNAL(clicked()), this, SLOT(eraseGr()));
        disconnect(accedi,0,0,0);
        connect(accedi, SIGNAL(clicked()), this, SLOT(quitGr()));
        disconnect(upgrade,0,0,0);
        connect(upgrade, SIGNAL(clicked()), this, SLOT(enterGr()));
    }
}

void TabUser::AmmUs(){
    logout();
}

void TabUser::tabba(){
    if(tabbed->count()>0){  //se c'e' piu' di una tab, rendo possibile la chiusura da tab
        tabbed->setTabsClosable(true);
    }
    tab= new TabUser(tabbed,user, gestore,db);
    tabbed->addTab(tab,"Login Utente");
    tabbed->setCurrentIndex(tabbed->indexOf(tab));

    connect(tabbed, SIGNAL(tabCloseRequested(int)), tab, SLOT(removeatab(int)));
}

void TabUser::closetab(){
    if(tabbed->close()) //se chiudo tabbed...
          user->setEnabled(true); //riattivo relativo pushbutton
}

void TabUser::ridim(int x){
    switch(x){
    case 1:
        le5->show();
        le6->hide();
        le7->hide();
        le8->hide();
        le9->hide();
        le10->hide();
        break;
    case 2:
        le5->show();
        le6->show();
        le7->hide();
        le8->hide();
        le9->hide();
        le10->hide();
        break;
    case 3:
        le5->show();
        le6->show();
        le7->show();
        le8->hide();
        le9->hide();
        le10->hide();
        break;
    case 4:
        le5->show();
        le6->show();
        le7->show();
        le8->show();
        le9->hide();
        le10->hide();
        break;
    case 5:
        le5->show();
        le6->show();
        le7->show();
        le8->show();
        le9->show();
        le10->hide();
        break;
    case 6:
        le5->show();
        le6->show();
        le7->show();
        le8->show();
        le9->show();
        le10->show();
        break;
    }
}

void TabUser::gestaccount(){    //chiamato quando viene premuto il "?" nella registrazione.
    tab= new TabUser(0,0,0,0);
    tab->setWindowTitle("Differenze tra tipologie di Account");
    tab->show();
    tab->acc(); //spiegazione delle differenze tra gli account
}

void TabUser::login(){
    QString username= le1->text();
    QString pwd= le2->text();
    current= gestore->verify(username, pwd);
    if(current){
        QString n= current->getNome();
        QString c= current->getCognome();
        QString nc= "Sessione utente: ";
        nc.append(n).append(" ").append(c);
        //controllo che non ci sia gia' una sessione aperta per questo utente
        bool find= false;
        for(int i=0; i<tabbed->count() && !find; i++){
            if(tabbed->tabText(i)==nc){
                alert->setText("Utente gia' loggato. \nSessione gia' in uso");
                find= true;
            }   //se find e' rimasto false posso continuare, altrimenti vuol dire che sessione e' gia' aperta
        }
        if(!find) {
            hideAll();
            int index= tabbed->indexOf(this);
            tabbed->setTabText(index, nc);
            showprofile(current);
        }
        else alert->show();
    }
    else{   //login non riuscito
        alert->show();
    }
}

void TabUser::regist(){
    hideAll();
    new_user->hide();
    clear_le();

    step->setText("Primo passo: Informazioni personali");
    label1->setText("Nome");
    label2->setText("Cognome");
    registro->setText("Continua");

    int index= tabbed->indexOf(this);
    tabbed->setTabText(index, "Registrazione utente, Passo I");

    step->show();
    label1->show();
    label2->show();
    label3->show();
    label4->show();
    label5->show();
    label6->show();
    le1->show();
    le2->show();
    le3->show();
    le4->show();
    cb->show();
    cbacc->show();
    infoacc->show();
    registro->show();

    disconnect(registro,0,0,0);
    connect(registro, SIGNAL(clicked()), this, SLOT(step2()));
    connect(infoacc, SIGNAL(clicked()), this, SLOT(gestaccount()));

    //nuovo layout
    layout->addWidget(step, 0,2);
    layout->addWidget(label1, 1,1, Qt::AlignRight| Qt::AlignTop);
    layout->addWidget(le1, 1,2, Qt::AlignLeft| Qt::AlignTop);
    layout->addWidget(label2, 2,1, Qt::AlignRight| Qt::AlignTop);
    layout->addWidget(le2, 2,2, Qt::AlignLeft| Qt::AlignTop);
    layout->addWidget(label3, 3,1, Qt::AlignRight| Qt::AlignTop);
    layout->addWidget(le3, 3,2,Qt::AlignLeft| Qt::AlignTop);
    layout->addWidget(label4,4,1, Qt::AlignRight| Qt::AlignTop);
    layout->addWidget(le4,4,2, Qt::AlignLeft| Qt::AlignTop);
    layout->addWidget(label5,5,1, Qt::AlignRight| Qt::AlignTop);
    layout->addWidget(cb,5,2, Qt::AlignLeft| Qt::AlignTop);
    layout->addWidget(label6,6,1, Qt::AlignRight| Qt::AlignTop);
    layout->addWidget(cbacc,6,2, Qt::AlignLeft| Qt::AlignTop);
    layout->addWidget(infoacc, 6,2, Qt::AlignRight);
    layout->addWidget(alert, 7,2,Qt::AlignCenter| Qt::AlignTop);
    layout->addWidget(registro,8,2, Qt::AlignCenter| Qt::AlignTop);

    //dimensione colonne
    layout->setColumnStretch(0,20);
    layout->setColumnStretch(1, 20);
    layout->setColumnStretch(2, 20);
    layout->setColumnStretch(3, 20);

    //dimensione righe
    layout->setRowStretch(0,5);
    layout->setRowStretch(1,5);
    layout->setRowStretch(2,5);
    layout->setRowStretch(3,5);
    layout->setRowStretch(4,5);
    layout->setRowStretch(5,5);
    layout->setRowStretch(6,5);
    layout->setRowStretch(7,5);
    layout->setRowStretch(8,5);
}

void TabUser::step2(){
    if(le1->text().isEmpty()||le2->text().isEmpty()||le3->text().isEmpty()||le4->text().isEmpty()){
        alert->setText("Alcuni campi vuoti. Riempire");
        alert->show();
    }
    else if(!check_free(le1->text())){
        alert->setText("Formato nome non valido. Riprovare");
        alert->show();
    }
    else if(!check_free(le2->text())){
        alert->setText("Formato cognome non valido. Riprovare");
        alert->show();
    }
    else if(gestore->foundusername(le3->text())){
        alert->setText("Username gia' in uso, cambiare");
        alert->show();
    }
    else{   //tutto ok! creo username e continuo
       tempusern= new Username(le1->text(), le2->text(), le3->text(), le4->text(), cb->currentIndex());
       stepinfo();
    }
}

void TabUser::end(){
    QString mese= mm->currentText();
    if(mese=="Aprile" || mese=="Giugno" || mese=="Settembre" || mese=="Novembre"){
                if(gg->currentIndex()==30){ //index parte da 0, il giorno 31 e' indicato dall'index 30
                    alert->setText("Data di nascita non corretta.");
                    alert->show();
                }
                else check_other(); //ok,check su altri campi
    }
    else if(mese=="Febbraio"){
        if(gg->currentIndex()>28){  //idem di sopra
            alert->setText("Data di nascita non corretta.");
            alert->show();
        }
        else check_other(); //ok,check su altri campi
    }
    else check_other(); //ok,check su altri campi
}

void TabUser::showgroups(){
    switch(tryAcc(current)){
    case 0: case 1:
        missingacc();
        return;
    case 2:
        hideAll();

        label1->setText("Gruppi");
        label1->show();
        layout->addWidget(label1,0,1, Qt::AlignCenter);
        registro->setText("Aggiungi Gruppo");
        registro->setIcon(QIcon("icons/addgruppo.jpg"));
        registro->show();

        layout->addWidget(registro,0,4);

        current->gestionegruppo(registro);  //setto enable/disable il tasto in base al profilo Account

        QVector<Gruppo*> gruppi= current->getGru();     //gruppi dell'account corrente
        int row= 2;
        if(gruppi.isEmpty()){
            label3->setText("Nessun gruppo");
            label3->show();
            layout->addWidget(label3, row,1, Qt::AlignTop);
        }
        else{
            g.clear();
            for(QVector<Gruppo*>::iterator it= gruppi.begin(); it!= gruppi.end(); it++){
                QPushButton* pb= new QPushButton((*it)->getNome());
                g.insert(pb,(*it));
                connect(pb, SIGNAL(pressed()), this, SLOT(showgroup()));
            }
            for(QMap<QPushButton*, Gruppo*>::const_iterator i = g.constBegin(); i!= g.constEnd(); i++,row++)
                layout->addWidget(i.key(),row,1, Qt::AlignTop);
        }
        back->show();
        new_user->show();
        back->setEnabled(true);

        int numrows= layout->rowCount();

        dim_row(row,numrows);   //ridimensiono righe

        layout->addWidget(back, numrows, 0);
        layout->addWidget(new_user, numrows, 4);
        disconnect(registro,0,0,0);
        connect(registro, SIGNAL(clicked()), this, SLOT(creagruppo()));
    }
}

void TabUser::showfriends(){
    switch(tryAcc(current)){
    case 0: case 1:
        missingacc();
        return;
    case 2:
        hideAll();

        label1->setText("Contatti");
        label1->show();
        layout->addWidget(label1,0,1, Qt::AlignCenter);
        QVector<Contatto*> contatti= current->getColl();
        int row= 1;
        profac.clear();
        for(QVector<Contatto*>::iterator it= contatti.begin(); it!= contatti.end(); it++){
            QPushButton* pb= new QPushButton((*it)->getNome().append(" ").append((*it)->getCognome()));
            if(!((*it)->getTag()).isEmpty())
                pb->setText(pb->text().append(", ").append((*it)->getTag()));
            int s= (*it)->getGender();
            pbicon(pb,s);
            Account* acc= gestore->getAcc((*it));   //mi trovo l'account corrispondente
            profac.insert(pb,acc);
            connect(pb, SIGNAL(pressed()), this, SLOT(showuser()));
            }

        if(!sortPA(row))
            label3->setText("Nessun collegamento");

        back->show();
        new_user->show();
        back->setEnabled(true);

        int numrows= layout->rowCount();

        dim_row(row,numrows);   //ridimensiono righe

        if(current->getMax()){
            int rimanenti= current->getMax()-contatti.count();
            QString r= "Puoi aggiungere ancora ";
            QString x;
            r.append(x.setNum(rimanenti)).append(" contatti");
            alert->setText(r);
            alert->show();
            layout->addWidget(alert, numrows-1, 1);
        }

        layout->addWidget(back, numrows, 0);
        layout->addWidget(new_user,numrows, 4);
    }
}

void TabUser::creagruppo(){
    hideAll();
    clear_le();

    QFont font= label3->font();
    label1->setText("Nuovo Gruppo");
    label2->setText("Id del gruppo");
    label2->setFont(font);
    label3->setText("Nome del gruppo");
    label1->show();
    label2->show();
    label3->show();
    le1->show();
    le2->show();
    accedi->setText("Crea");
    accedi->show();
    layout->addWidget(label1, 0,1, Qt::AlignLeft);
    layout->addWidget(label2, 3,0,Qt::AlignRight);
    layout->addWidget(le1, 3,1);
    layout->addWidget(label3,4,0, Qt::AlignRight);
    layout->addWidget(le2,4,1);
    layout->addWidget(alert, 5,1, Qt::AlignCenter);

    back->show();
    new_user->show();
    int numrows= layout->rowCount();
    layout->addWidget(accedi, numrows-1,1, Qt::AlignCenter);
    layout->addWidget(back, numrows, 0);
    layout->addWidget(new_user, numrows, 4);

    disconnect(accedi,0,0,0);
    connect(accedi,SIGNAL(clicked()), this,SLOT(crea()));
}

void TabUser::crea(){
    switch(tryAcc(current)){
    case 0: case 1:
        missingacc();
        return;
    case 2:
        if(!(gestore->checkgroup(le1->text()))){
            alert->setText("Id gruppo gia' presente.\nIscriversi a quel gruppo o cambiare id");
            alert->show();
        }
        else{
            Gruppo* g= new Gruppo(le1->text(), le2->text(), current->getNick());
            gestore->addgruppo(g);
            current->insertGruppo(g);
            //Inserire in database
            QSqlQuery query(*db);
            db->transaction();
            query.prepare("Insert into gruppi(proprietario,id_group,nome,username) values(:pr,:id,:n,:p)");
            query.bindValue(":pr", g->getProp());
            query.bindValue(":id", g->getId());
            query.bindValue(":n", g->getNome());
            query.bindValue(":p", current->getNick());
            query.exec();
            db->commit();
            QString testo= "Creato gruppo.\nId: ";
            testo.append(g->getId()).append(", Nome: ").append(g->getNome());
            QMessageBox::about(this,"Creazione riuscita",testo);
            showgroups();
        }
    }
}

void TabUser::backslot(){   //il tasto back mi rimanda sempre al profilo dell'account in uso!
    showprofile(current);
}

void TabUser::chooseTag(){
    switch(tryAcc(usercurr)){
    case 0:
        missingacc();
        return;
    case 1:
        cercaUser_g();
        return;
    case 2:
        hideAll();
        label1->show();
        QString ltg= "Hai scelto di aggiungere ";
        ltg.append(usercurr->getNome()).append(" ").append(usercurr->getCognome()).append(" ai \ntuoi contatti. Aggiungi un tag");
        label3->setText(ltg);
        label3->show();
        registro->setText("Continua");
        registro->setIcon(QIcon(""));
        registro->show();

        layout->addWidget(label3, 2, 1, Qt::AlignLeft|Qt::AlignBottom);

        int row=4;
        for(int i=0; i<bgtag->buttons().count(); i++,row++){
            layout->addWidget(bgtag->button(i), row,1);
            bgtag->button(i)->show();
        }
        layout->addWidget(registro, row,1, Qt::AlignCenter);

        int numrows= layout->rowCount();

        dim_row(row,numrows);   //ridimensiono righe

        layout->addWidget(back, numrows, 0);
        layout->addWidget(new_user,numrows, 4);
        back->show();
        new_user->show();

        disconnect(registro,0,0,0);
        connect(registro,SIGNAL(clicked()), this, SLOT(add()));
    }
}

void TabUser::add(){
    switch(tryAcc(usercurr)){
    case 0:
        missingacc();
        return;
    case 1:
        cercaUser_g();
        return;
    case 2:
        bool found= false;
        int i=0;
        for(;i<bgtag->buttons().count() && !found; i++){
            if(bgtag->button(i)->isChecked()){
                found= true;
            }
        }
        int x= i-1;
        Tag* tag;
        switch(x){  //no= 0,amico= 1,collega= 2, parente= 3, partner= 4, compagno_di_studi= 5, membro_di_gruppo= 6
        case 0:
            tag= new Tag(no);
            break;
        case 1:
            tag= new Tag(amico);
            break;
        case 2:
            tag= new Tag(collega);//tag;
            break;
        case 3:
            tag= new Tag(parente);//tag;
            break;
        case 4:
            tag= new Tag(partner);//tag;
            break;
        case 5:
            tag= new Tag(compagno_di_studi);//tag;
            break;
        case 6:
            tag= new Tag(membro_di_gruppo);//tag;
            break;
        }
        Contatto* contact= new Contatto(tag, usercurr->getUsername(), usercurr->getProfilo());
        if(!(current->insertContatto(contact))){
            QMessageBox::about(this, "Errore Contatti", "Numero massimo di contatti raggiunto."
                               "\nImpossibile aggiungere un altro contatto.");
            showfriends();
        }
        else{
            //Inserimento su database
            QSqlQuery query(*db);
            db->transaction();
            query.prepare("Insert into contatti(user1,user2,tag) values(:user1,:user2,:tag)");
            query.bindValue(":user1", current->getNick());
            query.bindValue(":user2", usercurr->getNick());
            query.bindValue(":tag", x);
            query.exec();
            db->commit();
            QString avviso("Hai aggiunto alla lista dei tuoi contatti\n");
            avviso.append(usercurr->getNome()).append(" ").append(usercurr->getCognome());
            QMessageBox::about(this,"Operazione riuscita",avviso);
            showprofile(current);
        }
    }
}

void TabUser::remove(){
    switch(tryAcc(usercurr)){
    case 0:
        missingacc();
        return;
    case 1:
        showfriends();
        return;
    case 2:
        current->eraseContatto(usercurr);
        //Delete su database
        QSqlQuery query(*db);
        db->transaction();
        query.prepare("Delete from contatti where user1=:user1 and user2=:user2");
        query.bindValue(":user1", current->getNick());
        query.bindValue(":user2", usercurr->getNick());
        query.exec();
        db->commit();
        QString avviso("Tolto dalla lista dei collegamenti il contatto\n");
        avviso.append(usercurr->getNome()).append(" ").append(usercurr->getCognome());
        QMessageBox::about(this,"Operazione riuscita",avviso);
        showprofile(current);
    }
}

void TabUser::confirm(){
    Tab::confirm();
    alert->setText("\nATTENZIONE.\n\nHai scelto di eliminare il tuo Account\nsu Legami.\n\nSei sicuro?\n");
    new_user->show();

    disconnect(accedi,0,0,0);
    connect(accedi, SIGNAL(clicked()), this, SLOT(deleteacc()));
    disconnect(registro,0,0,0);
    connect(registro,SIGNAL(clicked()), this, SLOT(backslot()));
}

void TabUser::up(){
    switch(tryAcc(current)){
    case 0: case 1:
        missingacc();
        return;
    case 2:
        acc();  //scelta tra i vari tipi di account
        back->show();
        back->setEnabled(true);
        new_user->show();
        current->gestQPBchoice(registro,canc);  //in base al TD di current, enable o disable i tasti presenti in acc()

        disconnect(registro, 0,0,0);
        connect(registro, SIGNAL(clicked()), this, SLOT(upgrade_bus()));
        disconnect(canc,0,0,0);
        connect(canc, SIGNAL(clicked()), this, SLOT(upgrade_exe()));
    }
}

void TabUser::upgrade_bus(){
    //le copie di username, profilo e la copia base di Contatto vanno messe qui perche' se fossero create all'interno di una
    //delle funzioni successive,al ritorno della chiamata sarebbero distrutte(come da comportamento del distruttore)
    //e con esse gli oggetti a cui puntavano.
    usnm= new Username(*(current->getUsername()));
    prfl= new Profilo(*(current->getProfilo()));
    cont= new Contatto(0,usnm,prfl);
    current= gestore->upgradeB(current,usnm,prfl,cont);
    QMessageBox::about(this, "Upgrade riuscito", "Profilo dell'utente aggiornato a BusinessAccount");
    showprofile(current);
    up_db(1);
}

void TabUser::upgrade_exe(){
    //le copie di username, profilo e la copia base di Contatto vanno messe qui perche' se fossero create all'interno di una
    //delle funzioni successive,al ritorno della chiamata sarebbero distrutte(come da comportamento del distruttore)
    //e con esse gli oggetti a cui puntavano.
    usnm= new Username(*(current->getUsername()));
    prfl= new Profilo(*(current->getProfilo()));
    cont= new Contatto(0,usnm,prfl);
    current= gestore->upgradeE(current,usnm,prfl,cont);
    QMessageBox::about(this, "Upgrade riuscito", "Profilo dell'utente aggiornato ad ExecutiveAccount");
    showprofile(current);
    up_db(2);
}

void TabUser::query(){
    switch(tryAcc(current)){
    case 0: case 1:
        missingacc();
        return;
    case 2:
        int cont= current->limitsu();
        QString nome= le1->text();
        QString cognome= le2->text();
        QString username= le3->text();
        QVector<Account*>* risultato= new QVector<Account*>();
        risultato= gestore->searchU(cont,nome,cognome,username);
        //Questa "funzione" qui sotto e' gia' stata usata,ma non posso riutilizzarla perche' cambia qualcosa. Devo riscrivermela!
        profac.clear();
        int row=3;
        for(QVector<Account*>::iterator it= risultato->begin(); it!= risultato->end(); it++){
            if((*it)->getNick()!=current->getNick()){ //se e' l'utente loggato, non lo mostro
                                               //(bastava fare confronto *it vs current, non e' cambiata la zona di memoria!)
                QPushButton* pb= new QPushButton((*it)->getNome().append(" ").append((*it)->getCognome()));
                int s= (*it)->getGender();
                pbicon(pb,s);
                profac.insert(pb,(*it));
                connect(pb, SIGNAL(pressed()), this, SLOT(showuser()));
                }
            }

        if(!sortPA(row))   //riordino profac
            label3->setText("Nessun risultato corrispondente alla tua ricerca."
                            "\nVerifica l'ortografia o prova con un altro termine.");

        label1->setText("Risultato della ricerca");
        label1->show();
        back->show();
        if(cont && profac.count()){    //se cont==0, non c'e' limite!!, se profac.count==0,nessun risultato!!
            int rimanenti= cont-profac.count();
            QString x; x.setNum(cont);
            if(!rimanenti){
                alert->setText("Numero massimo di risultati ottenuti");
            }
            else{
                QString r= "Ricerca completata.\nMassimo numero di risultati: ";
                r.append(x);
                alert->setText(r);
            }
            alert->show();
            layout->addWidget(alert,row,1);
        }
    }
}

void TabUser::queryg(){
    switch(tryAcc(current)){
    case 0: case 1:
        missingacc();
        return;
    case 2:
        int cont= current->limitsg();
        QString id= le1->text();
        QString nome= le2->text();
        QString prop= le3->text();
        QVector<Gruppo*>* risultato= new QVector<Gruppo*>();
        risultato= gestore->searchG(cont,id,nome,prop);
        g.clear();
        int row= 2;
        for(QVector<Gruppo*>::iterator it= risultato->begin(); it!= risultato->end(); it++){
            QPushButton* pb= new QPushButton((*it)->getNome());
            g.insert(pb,(*it));
            connect(pb, SIGNAL(pressed()), this, SLOT(showgroup()));
        }

        sortG(row);
        label1->setText("Risultato della ricerca");
        label1->show();
        back->show();
        if(cont && g.count()){    //se cont==0, non c'e' limite!!, se g.count==0,nessun risultato!!
            int rimanenti= cont-profac.count();
            QString x; x.setNum(cont);
            if(!rimanenti){
                alert->setText("Numero massimo di risultati ottenuti");
            }
        else{
            QString r= "Ricerca completata.\nMassimo numero di risultati: ";
            r.append(x);
            alert->setText(r);
        }
        alert->show();
        layout->addWidget(alert,row,1);
        }
    }
}

void TabUser::cercaProfiloU(Account* acc){
    switch(tryAcc(acc)){
    case 0:
        missingacc();
        return;
    case 1:
        showprofile(current);
        return;
    case 2:
        showprofile(acc);
        return;
    }
}

void TabUser::cercaProfiloG(Gruppo* gr){
    switch(tryGru(gr)){
    case 0:
        missingacc();
        return;
    case 1:
        showgroups();
        return;
    case 2:
        grcurr= gr;
        showG(grcurr);
        return;
    }
}
